package com.yonyou.distribute.service;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.yonyou.distribute.mapper.StockMapper;
import com.yonyou.distribute.pojo.Stock;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import javax.annotation.Resource;
import java.util.concurrent.locks.ReentrantLock;

/**
 * p6: 使用 jvm 本地锁解决 mysql 超卖问题
 *
 * 两个用户 a b
 * a：开启事务              b：开始事务
 * a:获取事务
 * a:查询库存21
 * a:扣减库存20
 * a:释放锁
 * a:                     b:获取锁
 * a:                     b:查询库存21
 * a:提交事务
 */
@Service
public class MysqlService_2 {

    @Resource
    private StockMapper stockMapper;

    /**
     * jvm 本地锁 解决单机超卖
     * 但是三种情况会导致 jvm 本地锁失效
     * 1、多例
     * 2、事务  ***
     * 3、集群
     */
    private ReentrantLock lock = new ReentrantLock();

    /**
     * 1、开启事务
     * 2、获取锁
     * 3、查询库存
     * 4、更新库存
     * 5、释放锁
     * 6、提交或者回滚事务
     */
    @Transactional
    public void deduct(){
        lock.lock();
        try {
            Stock stock = this.stockMapper.selectOne(new QueryWrapper<Stock>().eq("product_code", "1005"));
            if(null != stock && stock.getCount() > 0){
                stock.setCount(stock.getCount() - 1);
                this.stockMapper.updateById(stock);
            }
        }finally {
            lock.unlock();
        }
    }


}
